package com.schoolcolud.daomybatisplus.dto;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.schoolcloud.common.model.PageDTO;
import lombok.Data;
import org.springframework.beans.BeanUtils;

import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * @author hongmizfb
 * @date 2025/02/10
 */
@Data
public class MpPageUtil<T> extends PageDTO<T> {

    /**
     * 将MP查询的结果封装为PageDTO
     *
     * @param p     mp查询结果
     * @param clazz 集合元素的类型
     * @return {@link MpPageUtil}<{@link VO}>
     */
    public static <VO, PO> PageDTO<VO> of(Page<PO> p, Class<VO> clazz) {
        return of(p, po -> BeanUtil.copyProperties(po, clazz));
    }

    /**
     * 将MP查询的结果封装为PageDTO，如果vo和po的属性名不同
     *
     * @param p       Mp查询结果
     * @param convert 转换函数：例如 user->{BeanUtil.copyToList(xxx)},也可以手动处理复杂的转换
     * @return {@link MpPageUtil}<{@link VO}>
     */
    public static <VO, PO> PageDTO<VO> of(Page<PO> p, Function<PO, VO> convert) {
        MpPageUtil<VO> dto = new MpPageUtil<>();
        dto.setPageNum(p.getCurrent());
        dto.setTotal(p.getTotal());
        List<PO> records = p.getRecords();
        if (CollUtil.isEmpty(records)) {
            return dto;
        }
        List<VO> collect = records.stream().map(convert).collect(Collectors.toList());
        dto.setList(collect);
        return dto;
    }
}
